엔트로피

엔트로피(entropy)는 확률 변수가 담을 수 있는 정보의 양을 나타내는 값으로 다음과 같이 정의한다.

확률 변수 $X$가 이산 확률 변수이면

$$ H[X] = -\sum_{k=1}^K p(x_k) \log_2 p(x_k) $$

확률 변수 $X$가 연속 확률 변수이면

$$ H[X] = -\int p(x) \log_2 p(x) \; dx $$

이 식에서 $p(x)$는 확률 밀도(질량) 함수이다.

엔트로피 계산 예

실제로 엔트로피를 계산해 보자.

만약 이산 확률 변수가 1부터 8까지의 8개의 값 또는 클래스를 가질 수 있고 각각의 클래스에 대한 확률이 다음과 같다고 가정한다.

$$ \Big\{ \dfrac{1}{2}, \dfrac{1}{4}, \dfrac{1}{8}, \dfrac{1}{16}, \dfrac{1}{64}, \dfrac{1}{64}, \dfrac{1}{64}, \dfrac{1}{64} \Big\} $$

이 때의 엔트로피는 다음과 같다.

$$ H = -\dfrac{1}{2}\log_2\dfrac{1}{2} -\dfrac{1}{4}\log_2\dfrac{1}{4} -\dfrac{1}{8}\log_2\dfrac{1}{8} -\dfrac{1}{16}\log_2\dfrac{1}{16} -\dfrac{4}{64}\log_2\dfrac{1}{64} = 2 $$

만약 모든 가능한 값(클래스) $x_k$에 대해 $p(x_k) = 0$ 또는 $p(x_k) = 1$ 뿐이라면 엔트로피는 0 임을 알 수 있다. 이 경우는 사실 단 하나의 값만 나올 수 있는 경우이므로 정보가 없는 상수값이다.

만약 이산 확률 변수가 가질 수 있는 값(클래스)의 종류가 $2^K$이고 모두 같은 확률을 가진다면

$$ H = -\frac{2^K}{2^K}\log_2\dfrac{1}{2^K} = K $$

이다. 즉, 엔트로피는 이산 확률 변수가 가질 수 있는 확률 변수가 동일한 값의 가짓수와 같다.

(노트의 사례)


In [4]:
-1/6*np.log2(1/6)*6


Out[4]:
2.5849625007211561

In [5]:
-1/2*np.log2(1/2)-1/4*np.log2(1/4)-1/8*np.log2(1/8)-1/16*np.log2(1/16)-1/32*np.log2(1/32)-1/32*np.log2(1/32)


Out[5]:
1.9375
  • 압축 방법
    • 0000000100110...
    • 10 -> 1bit
    • p=0.5(베르누이 분포일 때) 가장 정보가 많은 경우
    • p=0.01 이라고 하면 0이 엄청나게 많고 1이 적은 경우
    • 압축하는 방법은 0이 몇 번 나오는 지 쓴다. 예를 들어 0이 7번 나오고 1이 2번 나오고 다시 0이 10번 나온다는 식으로 줄여서 쓴다. 그러면 이 숫자를 다시 이진법으로 쓰는 방식
    • p=0.5일 경우에는 압축의 의미가 없다. 계속 0과 1이 번갈아 나오기 때문
  • 원리는 그렇다. 확률 변수는 수치를 담고 있고 내가 얼마나 많은 정보를 가지고 있는 지를 판단할 수 있다.

In [ ]:

표본 데이터가 주어진 경우

확률 변수 모형, 즉 이론적인 확률 밀도(질량) 함수가 아닌 실제 데이터가 주어진 경우에는 확률 밀도(질량) 함수를 추정하여 엔트로피를 계산한다.

예를 들어 데이터가 모두 80개가 있고 그 중 Y = 0 인 데이터가 40개, Y = 1인 데이터가 40개 있는 경우는

$$ P(y=0) = \dfrac{40}{80} = \dfrac{1}{2} $$$$ P(y=1) = \dfrac{40}{80} = \dfrac{1}{2} $$$$ H[Y] = -\dfrac{1}{2}\log_2\left(\dfrac{1}{2}\right) -\dfrac{1}{2}\log_2\left(\dfrac{1}{2}\right) = \dfrac{1}{2} + \dfrac{1}{2} = 1 $$

In [1]:
-1/2*np.log2(1/2)-1/2*np.log2(1/2)
# 이럴 경우에는 아까 말한 0,1 두 개가 똑같아서 압축을 해도 의미가 없는 경우다.


Out[1]:
1.0

만약 데이터가 모두 60개가 있고 그 중 Y= 0 인 데이터가 20개, Y = 1인 데이터가 40개 있는 경우는

$$ P(y=0) = \dfrac{20}{60} = \dfrac{1}{3} $$$$ P(y=1) = \dfrac{40}{60} = \dfrac{2}{3} $$$$ H[Y] = -\dfrac{1}{3}\log_2\left(\dfrac{1}{3}\right) -\dfrac{2}{3}\log_2\left(\dfrac{2}{3}\right) = 0.92 $$

In [2]:
-1/3*np.log2(1/3)-2/3*np.log2(2/3)


Out[2]:
0.91829583405448956

만약 데이터가 모두 40개가 있고 그 중 Y= 0 인 데이터가 30개, Y = 1인 데이터가 10개 있는 경우는

$$ P(y=0) = \dfrac{30}{40} = \dfrac{3}{4} $$$$ P(y=1) = \dfrac{10}{40} = \dfrac{1}{4} $$$$ H[Y] = -\dfrac{3}{4}\log_2\left(\dfrac{3}{4}\right) -\dfrac{1}{4}\log_2\left(\dfrac{1}{4}\right) = 0.81 $$

In [3]:
-3/4*np.log2(3/4)-1/4*np.log2(1/4)


Out[3]:
0.81127812445913283

만약 데이터가 모두 20개가 있고 그 중 Y= 0 인 데이터가 20개, Y = 1인 데이터가 0개 있는 경우는

$$ P(y=0) = \dfrac{20}{20} = 1 $$$$ P(y=1) = \dfrac{0}{20} = 0 $$$$ H[Y] \rightarrow 0 $$

조건부 엔트로피

조건부 엔트로피는 다음과 같이 정의한다.

$$ H[Y \mid X] = - \sum_i \sum_j \,p(x_i, y_j) \log_2 p(y_j \mid x_i) $$$$ H[Y \mid X] = -\int \int p(x, y) \log_2 p(y \mid x) \; dxdy $$

이 식은 조건부 확률 분포의 정의를 사용하여 다음과 같이 고칠 수 있다.

$$ H[Y \mid X] = \sum_i \,p(x_i)\,H[Y \mid x_i] $$$$ H[Y \mid X] = \int p(x)\,H[Y \mid x] \; dx $$

위에는 X가 선택되지 않은 상황의 엔트로피의 가중합이고 아래는 X가 특정한 값이 선택된 경우의 가중합

(증명)

$$ \begin{eqnarray} H[Y \mid X] &=& - \sum_i \sum_j \,p(x_i, y_j) \log_2 p(y_j \mid x_i) \\ &=& - \sum_i \sum_j p(y_j \mid x_i) p(x_i) \log_2 p(y_j \mid x_i) \\ &=& - \sum_i p(x_i) \sum_j p(y_j \mid x_i) \log_2 p(y_j \mid x_i) \\ &=& \sum_i p(x_i) H[Y \mid x_i] \\ \end{eqnarray} $$

조건부 엔트로피와 결합 엔트로피는 다음과 같은 관계를 가진다.

$$ H[ X, Y ] = H[Y \mid X] + H[X] $$

조건부 엔트로피 계산의 예

예를 들어 데이터가 모두 80개가 있고 $X$, $Y$ 값이 다음과 같다고 하자

Y = 0 Y = 1 sum
X = 0 30 10 40
X = 1 10 30 40
$$ H[Y \mid X ] = p(X=0)\,H[Y \mid X=0] + p(X=1)\,H[Y \mid X=1] = \dfrac{40}{80} \cdot 0.81 + \dfrac{40}{80} \cdot 0.81 = 0.81 $$

만약 데이터가 모두 80개가 있고 $X$, $Y$ 값이 다음과 같다면

Y = 0 Y = 1 sum
X = 0 20 40 60
X = 1 20 0 20
$$ H[Y \mid X ] = p(X=0)\,H[Y \mid X=0] + p(X=1)\,H[Y \mid X=1] = \dfrac{60}{80} \cdot 0.92 + \dfrac{20}{80} \cdot 0 = 0.69 $$

실습 문제


In [6]:
-(25/100 * (20/25 * np.log2(20/25) + 5/25 * np.log2(5/25)) + 75/100 * (25/75 * np.log2(25/75) + 50/75 * np.log2(50/75)))


Out[6]:
0.8692038992627078